package com.hmall.api.client;

import com.hmall.api.client.fallback.ItemClientFallbackFactory;
import com.hmall.api.dto.ItemDTO;
import com.hmall.api.dto.OrderDetailDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Collection;
import java.util.List;

//此类就像Mapper接口一样，会被openFeign动态代理实现实现类
//标记他是一个Feign客户端-需要的服务名字为item-service
@FeignClient(value = "item-service",fallbackFactory = ItemClientFallbackFactory.class)//如果调用失败，就走ItemClientFallbackFactory的逻辑
public interface ItemClient {

    //这不是接收请求的方法 -是定义请求的方法 -也使用到了springMVC的注解
    @GetMapping("/items")
    List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids);

//如果当前已有 X（规定的）个线程正在调用 item-service/items，新的请求会被 Sentinel 立即拒绝（默认行为）或触发降级逻辑

    @PutMapping("/items/stock/deduct")
    void deductStock(@RequestBody List<OrderDetailDTO> items);
}

/*
Feign 会在运行时为这个接口生成动态代理实现类。
当你调用 queryItemByIds(ids) 方法时，Feign 会：
根据 @FeignClient("item-service") 找到名为 item-service 的服务实例（通过注册中心如 Nacos）。
根据 @GetMapping("/items") 拼接出完整的 URL（例如 http://item-service服务的ip和端口/items）。
将 ids 参数作为查询参数（?ids=1,2,3）附加到 URL。
发送 HTTP GET 请求到目标服务，并解析响应为 List<ItemDTO>。
 */